package com.common.utils;

import java.sql.Time;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;


/**
 * 日期工具类
 *
 * @author xin.ding
 * @date 2019/10/31 9:20
 */
public class DateUtils {

    /**
     * 时间格式
     */
    private static final String TIME_REGEX = "\\d{2}:\\d{2}:\\d{2}.*";
    /**
     * 日期格式
     */
    private static String[] datetimePatterns = {
            "yyyy-MM-dd"
            , "yyyy/MM/dd"
            , "yyyyMMdd"
            , "yyyy-MM-dd HH:mm"
            , "yyyy/MM/dd HH:mm"
            , "yyyy/MM/dd HH:mm:ss"
            , "yyyy-MM-dd HH:mm:ss"
            , "yyyy-MM-dd HH:mm:ss.SSS"
            , "yyyyMMddHHmmssSSS"
            , "yyyy-MM-dd'T'HH:mm:ss.SSSSSS"};

    public static final ThreadLocal<DateFormat> DATE_FORMAT = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };

    public static final ThreadLocal<DateFormat> DATE_SIMPLE_FORMAT = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyyMMdd");
        }
    };

    public static final ThreadLocal<DateFormat> TIME_SIMPLE_FORMAT = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("HH:mm:ss");
        }
    };

    /**
     * 线程安全
     * 获取当前系统当前日期时间 yyyy-MM-dd HH:mm:ss
     *
     * @return 时间字符串
     */
    public static String currentDateString() {
        return DATE_FORMAT.get().format(new Date());
    }

    /**
     * 线程安全
     * 获取指定Date 日期字符串 yyyyMMdd
     *
     * @return 日期字符串
     */
    public static String toSimpleDateString(Date date) {
        return DATE_SIMPLE_FORMAT.get().format(date);
    }

    /**
     * 线程安全
     * 获取指定Date 时间字符串 HH:mm:ss
     *
     * @return 时间字符串
     */
    public static String toSimpleTimeString(Date date) {
        return TIME_SIMPLE_FORMAT.get().format(date);
    }


    /**
     * 字符串转时间戳。yyyy-MM-dd HH:mm:ss[.f...]
     *
     * @param value 需要转换的字符串。
     * @return 转换后的时间戳。
     */
    public static Timestamp parseTimestamp(String value) {
        if (null == value || "".equals(value.trim())) {
            return null;
        }

        return Timestamp.valueOf(value);
    }

    /**
     * 字符串转时间
     *
     * @param str 需要转换的字符串
     * @return 转换后的时间
     */
    public static Time parseTime(String str) {
        if (str.matches(TIME_REGEX)) {
            return Time.valueOf(str.substring(0, 8));
        }

        return null;
    }


    /**
     * 获取现在时间,这个好用
     *
     * @return返回长时间格式 yyyy-MM-dd HH:mm:ss
     */
    public static Date getSqlDate() {
        Date sqlDate = new java.sql.Date(System.currentTimeMillis());
        return sqlDate;
    }

    public static void main(String[] args) {
//        System.out.println(getNowDate());
        System.out.println(nowDateTime());
    }

    /**
     * 输出如下
     * nowDateTime() --------------------------- 2020-01-12 12:02:56.0
     * nowDateTime().getTime() ------------------------- 1578801776000
     */
    /**
     * 获取当前日期时间，精确到秒
     * 例如:2020-12-22 18:11:44.0
     *
     * @return Date
     */
    public static Date nowDateTime() {
        return Timestamp.valueOf(
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.SIMPLIFIED_CHINESE).format(new Date())
        );
    }

    /**
     * 获取现在时间
     *
     * @return返回长时间格式 yyyy-MM-dd HH:mm:ss
     */
    public static Date getNowDate() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(currentTime);
        ParsePosition pos = new ParsePosition(8);
        Date currentTime_2 = formatter.parse(dateString, pos);
        return currentTime_2;
    }

    /**
     * 获取现在时间
     *
     * @return返回短时间格式 yyyy-MM-dd
     */
    public static Date getNowDateShort() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(currentTime);
        ParsePosition pos = new ParsePosition(8);
        Date currentTime_2 = formatter.parse(dateString, pos);
        return currentTime_2;
    }

    /**
     * 获取现在时间
     *
     * @return返回字符串格式 yyyy-MM-dd HH:mm:ss
     */
    public static String getStringDate() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(currentTime);
        return dateString;
    }

    /**
     * 获取现在时间
     *
     * @return 返回短时间字符串格式yyyy-MM-dd
     */
    public static String getStringDateShort() {
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(currentTime);
        return dateString;
    }

    /**
     * 获取时间 小时:分;秒 HH:mm:ss
     *
     * @return
     */
    public static String getTimeShort() {
        SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
        Date currentTime = new Date();
        String dateString = formatter.format(currentTime);
        return dateString;
    }

    /**
     * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss
     *
     * @param strDate
     * @return
     */
    public static Date strToDateLong(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }

    /**
     * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss
     *
     * @param dateDate
     * @return
     */
    public static String dateToStrLong(java.util.Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = formatter.format(dateDate);
        return dateString;
    }

    /**
     * 将短时间格式时间转换为字符串 yyyy-MM-dd
     *
     * @param dateDate
     * @param k
     * @return
     */
    public static String dateToStr(java.util.Date dateDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        String dateString = formatter.format(dateDate);
        return dateString;
    }

    /**
     * 将短时间格式字符串转换为时间 yyyy-MM-dd
     *
     * @param strDate
     * @return
     */
    public static Date strToDate(String strDate) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        ParsePosition pos = new ParsePosition(0);
        Date strtodate = formatter.parse(strDate, pos);
        return strtodate;
    }


    /**
     * 提取一个月中的最后一天
     *
     * @param day
     * @return
     */
    public static Date getLastDate(long day) {
        Date date = new Date();
        long date_3_hm = date.getTime() - 3600000 * 34 * day;
        Date date_3_hm_date = new Date(date_3_hm);
        return date_3_hm_date;
    }


}
